package com.ipartek.formacion.gestformwww.modelo.beans;

import com.ipartek.formacion.gestformwww.controlador.Verificador;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 *
 * @author Karmele Bidaurrazaga
 * @date 04/10/2010
 */
public class Alumno {

    private Integer aluId; //Clave
    private String aluNIF; //nvarchar(10)
    private String aluNSS; //nvarchar(50)
    private String aluTlf1; //nvarchar(9)
    private String aluTlf2; //nvarchar(9)
    private String aluMail; //nvarchar(50)
    private String aluDir; //nvarchar(50)
    private String aluLocalidad; //nvarchar(50)
    private Timestamp aluFechNac;
    private String aluNom; //nvarchar(25)
    private String aluApe1; //nvarchar(25)
    private String aluApe2; //nvarchar(25)
    private String aluObserv; //nvarchar(500)
    private Integer empId;
    private Integer proId;
    private ArrayList<Asistencia> asistencias;
    private boolean faltasTotales;
    private boolean faltasMes;
    private AlumCurso alumnCurso;
    private ArrayList<Calificacion> calificaciones;

    /**
     * Constructor con todos los parámetros
     * @param aluId Indetificador del alumno
     * @param aluNIF D.N.I del alumno
     * @param aluNSS Numero de la seguridad social del alumno
     * @param aluTlf1 Primer telefono del alumno
     * @param aluTlf2 Segundo telefono del alumno
     * @param aluMail E-mail del alumno
     * @param aluDir Dirección del alumno
     * @param aluLocalidad Localidad donde reside el alumno
     * @param aluFechNac Fecha de nacimiento del alumno
     * @param aluNom Nombre del alumno
     * @param aluApe1 Primer apellido del alumno
     * @param aluApe2 Segundo apellido del alumno
     * @param aluObserv Observaciones vinculadas al alumno
     * @param empId 
     * @param proId
     * @param asistencias Las asistencias realizadas por un alumno en un curso
     * @param alumCurso Los datos de la relacion de un alumno con el curso
     * @param calidicaciones Las calificaciones de un alumno en curso
     */
    public Alumno(Integer aluId, String aluNIF, String aluNSS, String aluTlf1, String aluTlf2, String aluMail, String aluDir, String aluLocalidad, Timestamp aluFechNac, String aluNom, String aluApe1, String aluApe2, String aluObserv, Integer empId, Integer proId, ArrayList<Asistencia> asistencias, ArrayList<Calificacion> calificaciones, AlumCurso alumCurso) {
        this.aluId = aluId;
        this.aluNIF = aluNIF;
        this.aluNSS = aluNSS;
        this.aluTlf1 = aluTlf1;
        this.aluTlf2 = aluTlf2;
        this.aluMail = aluMail;
        this.aluDir = aluDir;
        this.aluLocalidad = aluLocalidad;
        this.aluFechNac = aluFechNac;
        this.aluNom = aluNom;
        this.aluApe1 = aluApe1;
        this.aluApe2 = aluApe2;
        this.aluObserv = aluObserv;
        this.empId = empId;
        this.proId = proId;
        this.asistencias = asistencias;
        this.calificaciones = calificaciones;
        this.alumnCurso = alumCurso;
    }

    /**
     * Constructor por defecto
     */
    public Alumno() {
    }

    public String getAluApe1() {
        return aluApe1;
    }

    public void setAluApe1(String aluApe1) {
        this.aluApe1 = aluApe1;
    }

    public String getAluApe2() {
        return aluApe2;
    }

    public void setAluApe2(String aluApe2) {
        this.aluApe2 = aluApe2;
    }

    public String getAluDir() {
        return aluDir;
    }

    public void setAluDir(String aluDir) {
        this.aluDir = aluDir;
    }

    public Timestamp getAluFechNac() {
        return aluFechNac;
    }

    public void setAluFechNac(Timestamp aluFechNac) {
        this.aluFechNac = aluFechNac;
    }

    public Integer getAluId() {
        return aluId;
    }

    public void setAluId(Integer aluId) {
        this.aluId = aluId;
    }

    public String getAluLocalidad() {
        return aluLocalidad;
    }

    public void setAluLocalidad(String aluLocalidad) {
        this.aluLocalidad = aluLocalidad;
    }

    public String getAluMail() {
        return aluMail;
    }

    public void setAluMail(String aluMail) {
        this.aluMail = aluMail;
    }

    public String getAluNIF() {
        return aluNIF;
    }

    public void setAluNIF(String aluNIF) {
        this.aluNIF = aluNIF;
    }

    public String getAluNSS() {
        return aluNSS;
    }

    public void setAluNSS(String aluNSS) {
        this.aluNSS = aluNSS;
    }

    public String getAluNom() {
        return aluNom;
    }

    public void setAluNom(String aluNom) {
        this.aluNom = aluNom;
    }

    public String getAluObserv() {
        return aluObserv;
    }

    public void setAluObserv(String aluObserv) {
        this.aluObserv = aluObserv;
    }

    public String getAluTlf1() {
        return aluTlf1;
    }

    public void setAluTlf1(String aluTlf1) {
        this.aluTlf1 = aluTlf1;
    }

    public String getAluTlf2() {
        return aluTlf2;
    }

    public void setAluTlf2(String aluTlf2) {
        this.aluTlf2 = aluTlf2;
    }

    public Integer getEmpId() {
        return empId;
    }

    public void setEmpId(Integer empId) {
        this.empId = empId;
    }

    public Integer getProId() {
        return proId;
    }

    public void setProId(Integer proId) {
        this.proId = proId;
    }

    public AlumCurso getAlumnCurso() {
        return alumnCurso;
    }

    public void setAlumnCurso(AlumCurso alumnCurso) {
        this.alumnCurso = alumnCurso;
    }

    public ArrayList<Asistencia> getAsistencia() {
        return asistencias;
    }

    public void setAsistencia(ArrayList<Asistencia> asistencias) {
        this.asistencias = asistencias;
    }

    public ArrayList<Calificacion> getCalificaciones() {
        return calificaciones;
    }

    public void setCalificaciones(ArrayList<Calificacion> calificaciones) {
        this.calificaciones = calificaciones;
    }

    public void setAluFechNac(String parameter) {
        this.aluFechNac = Verificador.stringAFecha(parameter);
    }

    public void setEmpId(String parameter) {
        this.empId = Verificador.stringAInt(parameter);
    }

    public void setProId(String parameter) {
        this.proId = Verificador.stringAInt(parameter);
    }

    public boolean isFaltasMes() {
        return faltasMes;
    }

    public void setFaltasMes(boolean faltasMes) {
        this.faltasMes = faltasMes;
    }

    public boolean isFaltasTotales() {
        return faltasTotales;
    }

    public void setFaltasTotales(boolean faltasTotales) {
        this.faltasTotales = faltasTotales;
    }

    /**
     * valida que los datos del alumno son correctos
     * @return
     */
    public ArrayList<String> validar() {
        ArrayList<String> errores = new ArrayList<String>();
        if (aluNIF == null || aluNIF.trim().isEmpty()) {
            errores.add("error-nif-vacio");
        }
        if (!Verificador.validarDni(aluNIF)) {
            errores.add("error-nif-incorrecto");
        }
        if (!Verificador.caracteresCorrectos(aluNIF)) {
            errores.add("error-nif-incorrecto");
        }
        if (!aluNSS.isEmpty() && !Verificador.numeroLongValido(aluNSS)) {
            errores.add("error-nss-incorrecto");
        }
        if (aluNom == null || aluNom.trim().isEmpty()) {
            errores.add("error-nombre-vacio");
        }
        if (!Verificador.caracteresCorrectos(aluNom)) {
            errores.add("error-nombre-incorrecto");
        }
        if (aluApe1 == null || aluApe1.trim().isEmpty()) {
            errores.add("error-apellido1-vacio");
        }
        if (!Verificador.caracteresCorrectos(aluApe1)) {
            errores.add("error-apellido1-incorrecto");
        }
        if (aluApe2 == null || aluApe2.trim().isEmpty()) {
            errores.add("error-apellido2-vacio");
        }
        if (!Verificador.caracteresCorrectos(aluApe2)) {
            errores.add("error-apellido2-incorrecto");
        }
        if (!aluTlf1.isEmpty() && !Verificador.numeroValido(aluTlf1)) {
            errores.add("error-tlf1-incorrecto");
        }
        if (!aluTlf2.isEmpty() && !Verificador.numeroValido(aluTlf2)) {
            errores.add("error-tlf2-incorrecto");
        }
        if (!Verificador.caracteresCorrectos(aluDir)) {
            errores.add("error-direccion-incorrecta");
        }
        if (!Verificador.caracteresCorrectos(aluLocalidad)) {
            errores.add("error-localidad-incorrecta");
        }
        if (!Verificador.caracteresCorrectos(aluMail)) {
            errores.add("error-mail-incorrecto");
        }
        return errores;
    }

    /**
     * Metodo que comprueba si el alumno se ha pasado de las faltas que puede realizar en un mes
     * @author Sara y Adrian
     * @param faltas Total de faltas por mes que se puedan hacer
     * @return setea a true el atributo faltasMes del alumno si se ha pasado y a false si no se ha pasado
     */
    public void calcularFaltasMes(Integer faltas) {
        this.faltasMes = false;
        HashMap hm = new HashMap();
        String fecha;
        String[] clave;
        int falta;
        Iterator it;

        for (int i = 0; i < asistencias.size(); i++) {
            if (!asistencias.get(i).isAsiJustificada()) {
                fecha = Verificador.formatearFecha(asistencias.get(i).getAsiFch());
                clave = fecha.split("/");
                if (hm.get(clave[1] + clave[2]) != null) {
                    falta = (Integer) hm.get(clave[1] + clave[2]);
                    hm.put(clave[1] + clave[2], falta + 1);
                } else {
                    hm.put(clave[1] + clave[2], 1);
                }
            }
        }

        it = hm.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry) it.next();
            if ((Integer) e.getValue() > faltas) {
                this.faltasMes = true;
            }
        }
    }

    /**
     * Metodo que comprueba si el alumno se ha pasado de las faltas totales que puede realizar en el curso
     * @author Sara y Adrian
     * @param faltas Total de faltas totales que se puedan hacer en un curso
     * @return setea a true el atributo faltasTotales del alumno si se ha pasado y a false si no se ha pasado
     */
    public void calcularFaltasTotales(Integer faltas) {
        int sumafaltasTotales = asistencias.size();
        if (sumafaltasTotales > faltas) {
            this.faltasTotales = true;
        } else {
            this.faltasTotales = false;
        }
    }
}
